﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Model.Contratos;
using Model.Clientes;
using Model.Produtos;

namespace welwitschia.Contratos
{
    public partial class ContratoDetalhe :PaginaBase
    {
        protected void Page_Load(object sender, EventArgs e)
        {
 
            if (!Page.IsPostBack)
            {
                IClienteService clienteService = new ClienteService();
                ddlCliente.DataSource = clienteService.ObterTodos();
                ddlCliente.DataTextField = "Nome";
                ddlCliente.DataValueField = "IdCliente";
                ddlCliente.DataBind();
                ddlCliente.Items.Insert(0, new ListItem() { Text = String.Empty, Value = "-1000" });

                if (String.IsNullOrEmpty(Request.QueryString["nc"]))
                {
                    LimpaDadosForm();
                    txtDataContrato.Text = DateTime.Now.ToString("d");
                    btnAdRefeicao.Enabled = false;
                }
                else
                {
                    IContratoService contratoService = new ContratoService();
                    Contrato contrato = contratoService.ObterPorNumeroContrato(Convert.ToInt64(Request.QueryString["nc"]));
                    txtNumeroContrato.Text = contrato.NumeroContrato.ToString();
                    txtDataContrato.Text = contrato.DataInicioContrato.ToString("d"); 
                    txtDataFimContrato.Text = contrato.DataFimContrato.ToString("d");
                    txtDataInicioContrato.Text = contrato.DataInicioContrato.ToString("d");
                    ddlCliente.SelectedValue = contrato.Cliente.IdCliente.ToString();
                    CarregaddlUnidade(contrato.Cliente.IdCliente, contrato.Unidade.IdUnidade);
                    lvRefeicoes.DataSource = contratoService.ObterTodosRefeicaoPorContrato(contrato.NumeroContrato);
                    lvRefeicoes.DataBind();
                    btnAdRefeicao.Enabled = true;

                }
            }
        }

   
        protected void btnGravar_Click(object sender, EventArgs e)
        {
            IContratoService contratoService = new ContratoService();
            Contrato contrato = new Contrato();
            try
            {
                contrato.DataContrato = Convert.ToDateTime(txtDataContrato.Text);
                contrato.DataFimContrato = Convert.ToDateTime(txtDataFimContrato.Text);
                contrato.DataInicioContrato = Convert.ToDateTime(txtDataInicioContrato.Text);
            }
            catch (Exception ex)
            {
                MostraErro("Convert Date Time: " + ex.Message);
            }
            
            try
            {
                Cliente cliente = new Cliente() { IdCliente = Convert.ToInt64(ddlCliente.SelectedValue) };
                Unidade unidade = new Unidade() { IdUnidade = Convert.ToInt64(ddlUnidade.SelectedValue) };
                contrato.Cliente = cliente;
                contrato.Unidade = unidade;
                if (String.IsNullOrEmpty(txtNumeroContrato.Text))
                {
                    contrato = contratoService.Insere(contrato);
                    txtNumeroContrato.Text = contrato.NumeroContrato.ToString();
                    btnAdRefeicao.Enabled = true;
                }
                else
                {
                    contratoService.Actualiza(contrato);
                }

                MostraInfo("Gravado com Sucesso.");
            }
            catch (Exception ex)
            {
                MostraErro(ex.Message);
            }
        }

        protected void btnVoltar_Click(object sender, EventArgs e)
        {
            Response.Redirect(@"~\Contratos\ContratosLista.aspx");
        }

        protected void btnAdRefeicao_Click(object sender, EventArgs e)
        {
            Response.Redirect(@"~\Contratos\ContratoRefeicaoDetalhe.aspx?nc=" + txtNumeroContrato.Text);
        }

        private void LimpaDadosForm()
        {
            txtNumeroContrato.Text = String.Empty;
            txtDataContrato.Text = String.Empty;
            txtDataFimContrato.Text = String.Empty;
            txtDataInicioContrato.Text = String.Empty;
            ddlCliente.SelectedIndex = 0;
            ddlUnidade.Items.Clear();
        }

        protected void ddlCliente_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (ddlCliente.SelectedIndex > 0)
            {
                CarregaddlUnidade(Convert.ToInt64(ddlCliente.SelectedValue));
                BindTreeViewFamilias(Convert.ToInt64(ddlCliente.SelectedValue), null);
            }
            else
            {
                ddlUnidade.Items.Clear();
            }
        }

        private void CarregaddlUnidade(Int64 idCliente, Int64 idUnidade)
        {
            CarregaddlUnidade(idCliente);
            ddlUnidade.SelectedValue = idUnidade.ToString();
            BindTreeViewFamilias(Convert.ToInt64(ddlCliente.SelectedValue), idUnidade);
        }

        private void CarregaddlUnidade(Int64 idCliente)
        {
            IClienteService clienteService = new ClienteService();
            ddlUnidade.DataSource = clienteService.ObterUnidadesPorCliente(idCliente);
            ddlUnidade.DataTextField = "Designacao";
            ddlUnidade.DataValueField = "IdUnidade";
            ddlUnidade.DataBind();
        }

        protected void lvRefeicoes_ItemDeleting(object sender, ListViewDeleteEventArgs e)
        {
            IContratoService contratoService = new ContratoService();
            contratoService.Apaga(new RefeicaoContrato() { IdRefeicaoContratada = Convert.ToInt64(e.Keys["IdRefeicaoContratada"]) });
        }

        protected void lvRefeicoes_ItemEditing(object sender, ListViewEditEventArgs e)
        {
        }

        protected void lvRefeicoes_ItemCommand(object sender, ListViewCommandEventArgs e)
        {
            if (e.CommandName == "Edit")
                Response.Redirect(@"~\Contratos\ContratoRefeicaoDetalhe.aspx?rcid=" + e.CommandArgument.ToString());
        }



        private Dictionary<Int64, TreeNode> _idxTreeView = new Dictionary<Int64, TreeNode>();
 

        private void BindTreeViewFamilias(Int64 idCliente, Int64? idUnidade)
        {
            tvUnidades.Nodes.Clear();
            
            IClienteService clienteService = new ClienteService();
            IList<Unidade> unidades = clienteService.ObterUnidadesPorCliente(idCliente);

            IEnumerable<Unidade> found = unidades.Where<Unidade>(e => e.UnidadePai == null);
            foreach (Unidade u in found)
            {
                AddNode(u, idUnidade);
            }

            found = unidades.Where<Unidade>(e => e.UnidadePai != null);
            foreach (Unidade u in found)
            {
                AddNode(u, idUnidade);
            }
        }

        private void AddNode(Unidade unidade, Int64? idUnidade)
        {
            TreeNode node = new TreeNode();
            node.Text = unidade.Designacao;
            node.Value = unidade.IdUnidade.ToString();
            if (idUnidade.HasValue)
            {
                if (idUnidade.Value == unidade.IdUnidade)
                    node.Select();
            }
            _idxTreeView.Add(unidade.IdUnidade, node);

            if (unidade.UnidadePai != null)
            {
                TreeNode nodePai = _idxTreeView[unidade.UnidadePai.IdUnidade];
                nodePai.ChildNodes.Add(node);
            }
            else
            {
                tvUnidades.Nodes.Add(node);
            }
        }

        protected void tvUnidades_SelectedNodeChanged(object sender, EventArgs e)
        {
            ddlUnidade.SelectedValue = tvUnidades.SelectedValue;
        }
    }
}